/*
 * Copyright (C) 2011 SANSOU SYSTEMS Co., Ltd. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package jp.co.sansou.android.asynctask;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;

/**
 * <pre>
 * 独自に実装したAsyncTaskのクラス。
 * ProgressDialogを表示して時間のかかる処理をユーザに知らせます。
 * このクラスを使用してProgressDialogを表示する場合は、AndroidManifest.xmlファイルの
 * 該当<activity>タグに「android:configChanges="orientation|keyboardHidden"」属性設定を
 * 必ず設定してください。
 * この属性を設定しない場合、ProgressDialogを表示中に端末の向きを変更するとエラーが発生します。
 * </pre>
 *
 * @author s220484
 */
public class AsyncTaskProgressDialog extends AsyncTask<Void, Integer, Void> {

	/** 呼び出し元のActivity参照 */
	private Activity activity;

	/** ProgressDialogに表示するメッセージ */
	private String showMsg;

	/** ProgressDialogの参照 */
	private ProgressDialog dialog;

	/** バックグラウンド処理 */
	private IAsyncTaskDoInBackground asyncTask;

	/** コールバックメソッド */
	private IAsyncTaskCallBack callBack;

	/**
	 * <pre>
	 * ProgressDialog表示用のAsyncTaskProgressDialogクラスのコンストラクタです。
	 * 表示対象となる画面の参照（Activity）を引数にとります。
	 * </pre>
	 *
	 * @param activity
	 *            表示対象となる画面参照（Activity）
	 */
	public AsyncTaskProgressDialog(Activity activity, String showMsg, IAsyncTaskDoInBackground asyncTask, IAsyncTaskCallBack callBack) {
		this.activity = activity;
		this.showMsg = showMsg;
		this.asyncTask = asyncTask;
		this.callBack = callBack;
	}

	@Override
	protected void onPreExecute() {
		dialog = new ProgressDialog(this.activity);
		dialog.setMessage(showMsg);
		dialog.setIndeterminate(false); // ProgressDialogの進捗を表示する
		dialog.setCancelable(false); // Backキーを無効化
		dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		dialog.show();
	}

	@Override
	protected Void doInBackground(Void... params) {
		asyncTask.doInBackground();
		return null;
	}

	@Override
	protected void onPostExecute(Void result) {
		callBack.doInBackgroundCallBack();
		closeDialog();
	}

	private void closeDialog() {
		if (dialog != null && dialog.isShowing()) {
			dialog.dismiss();
			dialog = null;
		}
	}


}
